const Router = require('koa-router')

const { wxLoginCode, wxUserInfo } = require('../validators/wxDecryptVaildator')
const { Wx } = require('../service/wx')

const router = new Router({
    prefix: '/api/v1'
})

/**
* @api {post} /api/v1/wxDecrypt/loginCode 微信登录code换取openId,unionId
* @apiGroup wxDecrypt
* @apiVersion 1.0.0
* @apiParam {String} code wx.login返回的code
*
* @apiSuccess (success){String} validatorMsg 验证消息
* @apiSuccess (success){String} msg 返回消息
* @apiSuccess (success){Object} data 返回数据
* @apiSuccess (success){Int} errCode 状态码
* @apiSuccess (success){String} method 请求方式
* @apiSuccess (success){String} path 路径
* @apiSuccess (success){String} openid 微信openid
* @apiSuccess (success){String} unionid 微信unionid(多主体时候返回)
*
* @apiSuccessExample {json} 成功:
* {
*   "validatorMsg": [],
*   "msg": "", // 成功信息
*   "data": {},
*   "errCode": 0, // 状态码
*   "method": "", // 请求方式
*   "path": "" // 路径
* }
*
* @apiError (error){Array} validatorMsg 验证消息
* @apiError (error){String} msg 返回消息
* @apiError (error){Null} data 返回数据
* @apiError (error){Int} errCode 状态码
* @apiError (error){String} method 请求方式
* @apiError (error){String} path 路径
*
* @apiErrorExample {json} 失败:
* {
*   "validatorMsg": [],
*   "msg": "", //错误信息
*   "data": null,
*   "errCode": 10000 //状态码,
*   "method": "", // 请求方式
*   "path": "" // 路径
* }
*/
router.post('/wxDecrypt/loginCode', async (ctx, next) => {
    const v = await new wxLoginCode().validate(ctx)

    const data = await Wx.codeToToken(v.get('body.code'))

    if (data) {
        throw new global.errs.Success(data)
    } else {
        throw new global.errs.AuthFailed('用户信息获取失败')
    }
})

/**
* @api {post} /api/v1/wxDecrypt/encryptedData 微信userInfo、phoneNumber解密
* @apiGroup wxDecrypt
* @apiVersion 1.0.0
* @apiParam {String} encryptedData userInfo返回的encryptedData
* @apiParam {String} iv userInfo返回的iv
* @apiParam {String} sessionKey loginCode返回的sessionKey
*
* @apiSuccess (success){String} validatorMsg 验证消息
* @apiSuccess (success){String} msg 返回消息
* @apiSuccess (success){Int} errCode 状态码
* @apiSuccess (success){String} method 请求方式
* @apiSuccess (success){String} path 路径
* @apiSuccess (success){Object} data 返回数据
* @apiSuccess (success){String} avatarUrl 微信头像
* @apiSuccess (success){String} city 市级
* @apiSuccess (success){String} province 城市
* @apiSuccess (success){String} country 国家
* @apiSuccess (success){String} gender 性别 0：未知、1：男、2：女
* @apiSuccess (success){String} language 语言
* @apiSuccess (success){String} nickName 微信昵称
* @apiSuccess (success){String} openid 微信openid
* @apiSuccess (success){String} unionid 微信unionid(多主体时候返回)
*
* @apiSuccessExample {json} 成功:
* {
*   "validatorMsg": [],
*   "msg": "", // 成功信息
*   "data": {},
*   "errCode": 0, // 状态码
*   "method": "", // 请求方式
*   "path": "" // 路径
* }
*
* @apiError (error){Array} validatorMsg 验证消息
* @apiError (error){String} msg 返回消息
* @apiError (error){Null} data 返回数据
* @apiError (error){Int} errCode 状态码
* @apiError (error){String} method 请求方式
* @apiError (error){String} path 路径
*
* @apiErrorExample {json} 失败:
* {
*   "validatorMsg": [],
*   "msg": "", //错误信息
*   "data": null,
*   "errCode": 10000 //状态码,
*   "method": "", // 请求方式
*   "path": "" // 路径
* }
*/
router.post('/wxDecrypt/encryptedData', async (ctx, next) => {
    const v = await new wxUserInfo().validate(ctx)

    const data = await Wx.encryptedDataToken(v.get('body.encryptedData'), v.get('body.iv'), v.get('body.sessionKey'))

    if (!data) {
        throw new global.errs.AuthFailed('用户信息获取失败')
    }
    if (data.watermark.appid !== global.config.wx.appId) {
        throw new global.errs.AuthFailed('appId不对应')
    }
    throw new global.errs.Success(data)
})

module.exports = router
